parser grammar ExampleParser;

options {
  language = Java;
  tokenVocab = ExampleLexer;
}

@header {
package PL.prac8;
import java.util.Hashtable;
}

@rulecatch {catch (RecognitionException rre) {
  throw rre;}
 }
 
 @members {Hashtable variables = new Hashtable();}
 ///////////////////////////////
// Analizador sintáctico
/////////////////////////////// 
entrada : (asignacion|instruccion)* EOF;

asignacion: i=igualacion {
System.out.println("Asignacion "+i);};
instruccion: e=operacion {System.out.println ("Expresion: " + e);};

igualacion returns [String nombre = "";]:var=IDENT ASIGNACION e=expr PUNTOYCOMA 
{variables.put(var.getText(),e); nombre = "("+var.getText()+"): "+ e;};
operacion returns [int res = 0]: e=expr PUNTOYCOMA {res = e;};
expr returns[int res=0]: e1=exp_mult {res= e1;} ((MAS e2= exp_mult{res= res + e2;})|(MENOS e3= exp_mult {res = res - e3;}))* ;
exp_mult returns [int res=0]: e1=exp_base {res=e1;} ((ASTERISCO e2=exp_base {res=res*e2;}) |(BARRA e3=exp_base {res=res/e3;}))*;
                              catch [Exception ex] {
                                    System.out.println ("Error, no se puede dividir por cero");
                                    res = 0;
                              }
exp_base returns [int res= 0] : n=NUMERO {res = new Integer(n.getText()).intValue();}| 
                                APARENTESIS e=expr CPARENTESIS {res = e;}| 
                                var=IDENT  {res = (Integer) variables.get(var.getText());};